// 1. 创建一个新的axios实例
// 2.请求拦截器，如果有token进行头部携带
// 3.响应拦截器，(1)剥离无效数据，(2)处理token失效
// 4.导出一个函数，调用当前axios实例发请求，返回promise

import axios from "axios";
import store from "@/store";
import router from '@/router'
import { SET_USER_INFO } from "@/store/user/actionsType";

export const baseUrl = 'http://pcapi-xiaotuxian-front-devtest.itheima.net/'
const instance = axios.create({
    baseUrl,
    timeout: 5000
})

instance.interceptors.request.use(
    config => {
        // 拦截业务逻辑
        // 进行请求配置
        // 1.获取用户信息对象
        const { profile } = store.state.user
        // 2.设置token
        if (profile.token) {
            config.headers.Authorization = `Bearer ${profile.token}`
            // config.headers.Authorization = 'Bearer ' + 'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ7XCJuYW1lXCI6XCLoipzmuZblpKflj7jpqaxcIixcImlkXCI6XCIxMzY5NTk0OTU0NzM5ODU5NDU4XCIsXCJ1c2VybmFtZVwiOlwieGlhb3R1eGlhbjAwMVwifSIsImlhdCI6MTY0NDk5NzMyMSwiZXhwIjoxNjQ1MjU2NTIxfQ.xpXhd3DXS4ShzYo65sd41XWj2zGHGcHcxwbXLZ54wfY'
            
        }
        return config
    },
    err => {
        return Promise.reject(err)
    }
)

instance.interceptors.response.use(
    res => res.data,
    err => {
        // 401
        if (err.response && err.response.status === 401) {
            // 1.清空无效用户信息
            // 2.跳转登录页
            // 3.保存当前路由地址 
            store.dispatch(SET_USER_INFO, {})
            const fullPath = encodeURIComponent(router.currentRoute.value.fullPath)
            // console.log('router',router.currentRoute.value);
            // console.log('fullPath',fullPath);
            router.push('/login?redirectUrl=' + fullPath)
        }
        return Promise.reject(err)
    }
)


// 请求工具函数
export default (url, method, submitData) => {
    // 负责发请求, 请求地址, 请求方式, 提交的数据
    return instance({
        url,
        method,
        // 1.如果是get请求, 需要使用params来传递submitData    ?a=10&b=20
        // 2.如果不是get请求, 需要使用data来传递submitData     请求体
        // ES6语法, 属性名表达式. 允许字面量定义对象时, 把表达式放到方括号[]内
        // let propKey = 'foo';  let obj = { [propKey]: true }, 表达式还可以用于方法名!!!
        // [] -> 设置一个动态的key, 写js表达式, js表达式的执行结果当做key
        // method参数: get、Get、GET 转换成小写再来判断,  js中没有equalsIs吗
        [method.toLowerCase() === 'get' ? 'params' : 'data']: submitData
    })
}